﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Sinacor.UI.Bovespa.Corretagem.Communication;
using Sinacor.Infra.UI.Common;

namespace Sinacor.UI.Bovespa.Corretagem.Communication.Translator.ModelToDataContract
{
    public class Taxa
    {
        #region [PUB] ToChaveTaxaRequest

        public Bovespa.Corretagem.Taxa.ChaveTaxaRequest ToChaveTaxaRequest(Model.ChaveTaxa from)
        {
            if (from == null) return null;

            Bovespa.Corretagem.Taxa.ChaveTaxaRequest chavetaxarequest = new Bovespa.Corretagem.Taxa.ChaveTaxaRequest();

            switch (from.Cliente.Value)
            {
                case Model.Enum.TipoCliente.CarteiraPropria:
                    chavetaxarequest.Cliente = Bovespa.Corretagem.Taxa.TipoCliente.CarteiraPropria; 
                    break;
                case Model.Enum.TipoCliente.FundosClubeInvestimento:
                    chavetaxarequest.Cliente = Bovespa.Corretagem.Taxa.TipoCliente.FundosClubeInvestimento; 
                    break;
                case Model.Enum.TipoCliente.Normal:
                    chavetaxarequest.Cliente = Bovespa.Corretagem.Taxa.TipoCliente.Normal; 
                    break;                
                default:
                    break;
            }
            chavetaxarequest.CodigoBolsa = from.CodigoBolsa;

            switch (from.Liquidacao.Value)
            {
                case Model.Enum.TipoLiquidacao.Balcao:
                    chavetaxarequest.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.Balcao;          
                    break;
                case Model.Enum.TipoLiquidacao.OperacaoBox:
                    chavetaxarequest.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.OperacaoBox;
                    break;
                case Model.Enum.TipoLiquidacao.LiquidacaoBruta:
                    chavetaxarequest.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.LiquidacaoBruta;
                    break;
                case Model.Enum.TipoLiquidacao.Lancador:
                    chavetaxarequest.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.Lancador;
                    break;
                case Model.Enum.TipoLiquidacao.DesmancheBox:
                    chavetaxarequest.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.DesmancheBox;
                    break;
                case Model.Enum.TipoLiquidacao.Direto:
                    chavetaxarequest.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.Direto;
                    break;
                case Model.Enum.TipoLiquidacao.Normal:
                    chavetaxarequest.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.Normal;
                    break;
                case Model.Enum.TipoLiquidacao.Tomador:
                    chavetaxarequest.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.Tomador;
                    break;
                case Model.Enum.TipoLiquidacao.POP:
                    chavetaxarequest.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.POP;
                    break;
                case Model.Enum.TipoLiquidacao.TVR:
                    chavetaxarequest.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.TVR;
                    break;               

                case Model.Enum.TipoLiquidacao.BTF:
                    chavetaxarequest.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.BTF;
                    break;
                default:

                    break;
            }

            chavetaxarequest.Mercado = from.Mercado;
            chavetaxarequest.MercadoOrigem = from.MercadoOrigem;
            chavetaxarequest.NaturezaOperacao = (Bovespa.Corretagem.Taxa.TipoNaturezaOperacao)from.NaturezaOperacao;

            switch (from.Operacao.Value) 
            {
                case Model.Enum.TipoOperacao.OperacoesFinais:
                    chavetaxarequest.Operacao = Bovespa.Corretagem.Taxa.TipoOperacao.OperacoesFinais; 
                    break;
                case Sinacor.UI.Bovespa.Corretagem.Model.Enum.TipoOperacao.DayTrade:
                    chavetaxarequest.Operacao = Bovespa.Corretagem.Taxa.TipoOperacao.DayTrade; 
                    break;
                case Sinacor.UI.Bovespa.Corretagem.Model.Enum.TipoOperacao.OperacoesCobertas:
                    chavetaxarequest.Operacao = Bovespa.Corretagem.Taxa.TipoOperacao.OperacoesCobertas; 
                    break;
                case Sinacor.UI.Bovespa.Corretagem.Model.Enum.TipoOperacao.Precatorios:
                    chavetaxarequest.Operacao = Bovespa.Corretagem.Taxa.TipoOperacao.Precatorios; 
                    break;
                default:
                     break;
            }
            
            switch (from.Papel.Value)
            {
                case Model.Enum.TipoPapel.Debentures:
                    chavetaxarequest.Papel = Bovespa.Corretagem.Taxa.TipoPapel.Debentures; 
                    break;
                case Model.Enum.TipoPapel.Especialista:
                    chavetaxarequest.Papel = Bovespa.Corretagem.Taxa.TipoPapel.Especialista;
                    break;
                case Model.Enum.TipoPapel.Indice:
                    chavetaxarequest.Papel = Bovespa.Corretagem.Taxa.TipoPapel.Indice;
                    break;
                case Model.Enum.TipoPapel.Normal:
                    chavetaxarequest.Papel = Bovespa.Corretagem.Taxa.TipoPapel.Normal;
                    break;
                case Model.Enum.TipoPapel.Recibos:
                    chavetaxarequest.Papel = Bovespa.Corretagem.Taxa.TipoPapel.Recibos;
                    break;
                case Model.Enum.TipoPapel.POP:
                    chavetaxarequest.Papel = Bovespa.Corretagem.Taxa.TipoPapel.POP;
                    break;
                case Model.Enum.TipoPapel.CRI:
                    chavetaxarequest.Papel = Bovespa.Corretagem.Taxa.TipoPapel.CRI;
                    break;
                default:
                    break;
            }
            
            if (from.Periodo != null)
            {
                chavetaxarequest.Periodo = new Bovespa.Corretagem.Taxa.PeriodoRequest{
                                                    DataInicial = from.Periodo.DataInicial,
                                                    DataFinal = from.Periodo.DataFinal
                                                };
            }
             return chavetaxarequest;
        }
                
        #endregion

        #region [PUB] ToFiltroTaxaRequest

        public Bovespa.Corretagem.Taxa.FiltroTaxaRequest ToFiltroTaxaRequest(Model.Parameter.FiltroTaxa from)
        {            
            if (from == null) return null;
            
            Bovespa.Corretagem.Taxa.FiltroTaxaRequest filtrotaxa = new Bovespa.Corretagem.Taxa.FiltroTaxaRequest();

            filtrotaxa.Bolsa = from.Bolsa;
            filtrotaxa.Mercado = from.Mercado;
            filtrotaxa.MercadoOrigem = from.MercadoOrigem;

            if (from.NaturezaOperacao != null)
                filtrotaxa.NaturezaOperacao = (Bovespa.Corretagem.Taxa.TipoNaturezaOperacao)from.NaturezaOperacao;
            
            if (from.Periodo != null)
            {
                filtrotaxa.Periodo = new Bovespa.Corretagem.Taxa.PeriodoRequest
                                                {
                                                    DataInicial = from.Periodo.DataInicial,
                                                    DataFinal = from.Periodo.DataFinal
                                                };
            }
            
            return filtrotaxa;
        }

        public static List<Bovespa.Corretagem.Taxa.FiltroTaxaRequest> ToFiltroTaxaRequest(ModelCollection<Model.Parameter.FiltroTaxa> from)
        {
            if (from == null) return null;

            List<Bovespa.Corretagem.Taxa.FiltroTaxaRequest> retorno = new List<Bovespa.Corretagem.Taxa.FiltroTaxaRequest>();

            Bovespa.Corretagem.Taxa.FiltroTaxaRequest filtrotaxa;

            foreach (Model.Parameter.FiltroTaxa item in from)
            {
                filtrotaxa = new Bovespa.Corretagem.Taxa.FiltroTaxaRequest();

                filtrotaxa.Bolsa = item.Bolsa;
                filtrotaxa.Mercado = item.Mercado;
                filtrotaxa.MercadoOrigem = item.MercadoOrigem;

                filtrotaxa.NaturezaOperacao = (Bovespa.Corretagem.Taxa.TipoNaturezaOperacao?)item.NaturezaOperacao;


                if (item.Periodo != null)
                {
                    filtrotaxa.Periodo.DataInicial = item.Periodo.DataInicial;
                    filtrotaxa.Periodo.DataFinal = item.Periodo.DataFinal;
                }

                retorno.Add(filtrotaxa);
            }
            return retorno;
        }

        #endregion

        #region [PUB] ToTaxaRequest

        public Bovespa.Corretagem.Taxa.TaxaRequest ToTaxaRequest(Model.Taxa from)
        {            
            if (from == null) return null;
            
                Bovespa.Corretagem.Taxa.TaxaRequest taxa = new Bovespa.Corretagem.Taxa.TaxaRequest();

                //taxa.Cliente = (Bovespa.Corretagem.Taxa.TipoCliente)from.Cliente;
                switch (from.Cliente.Value)
                {
                    case Model.Enum.TipoCliente.CarteiraPropria:
                        taxa.Cliente = Bovespa.Corretagem.Taxa.TipoCliente.CarteiraPropria;
                        break;
                    case Model.Enum.TipoCliente.FundosClubeInvestimento:
                        taxa.Cliente = Bovespa.Corretagem.Taxa.TipoCliente.FundosClubeInvestimento;
                        break;
                    case Model.Enum.TipoCliente.Normal:
                        taxa.Cliente = Bovespa.Corretagem.Taxa.TipoCliente.Normal;
                        break;                    
                    default:
                        break;
                }

                taxa.CodigoBolsa = from.CodigoBolsa;
                
            //taxa.Liquidacao = (Bovespa.Corretagem.Taxa.TipoLiquidacao)from.Liquidacao;

                switch (from.Liquidacao.Value)
                {
                    case Model.Enum.TipoLiquidacao.Balcao:
                        taxa.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.Balcao;
                        break;
                    case Model.Enum.TipoLiquidacao.OperacaoBox:
                        taxa.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.OperacaoBox;
                        break;
                    case Model.Enum.TipoLiquidacao.LiquidacaoBruta:
                        taxa.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.LiquidacaoBruta;
                        break;
                    case Model.Enum.TipoLiquidacao.Lancador:
                        taxa.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.Lancador;
                        break;
                    case Model.Enum.TipoLiquidacao.DesmancheBox:
                        taxa.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.DesmancheBox;
                        break;
                    case Model.Enum.TipoLiquidacao.Direto:
                        taxa.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.Direto;
                        break;
                    case Model.Enum.TipoLiquidacao.Normal:
                        taxa.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.Normal;
                        break;
                    case Model.Enum.TipoLiquidacao.Tomador:
                        taxa.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.Tomador;
                        break;
                    case Model.Enum.TipoLiquidacao.POP:
                        taxa.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.POP;
                        break;
                    case Model.Enum.TipoLiquidacao.TVR:
                        taxa.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.TVR;
                        break;                    

                    case Model.Enum.TipoLiquidacao.BTF:
                        taxa.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.BTF;
                        break;
                    default:

                        break;
                }


                taxa.Mercado = from.Mercado;
                taxa.MercadoOrigem = from.MercadoOrigem;
                taxa.NaturezaOperacao = (Bovespa.Corretagem.Taxa.TipoNaturezaOperacao)from.NaturezaOperacao;

                taxa.NomeBolsa = from.NomeBolsa;
                taxa.NomeMercado = from.NomeMercado;
                taxa.NomeMercadoOrigem = from.NomeMercadoOrigem;

                switch (from.Operacao.Value)
                {
                    case Model.Enum.TipoOperacao.OperacoesFinais:
                        taxa.Operacao = Bovespa.Corretagem.Taxa.TipoOperacao.OperacoesFinais;
                        break;
                    case Model.Enum.TipoOperacao.DayTrade:
                        taxa.Operacao = Bovespa.Corretagem.Taxa.TipoOperacao.DayTrade;
                        break;
                    case Model.Enum.TipoOperacao.OperacoesCobertas:
                        taxa.Operacao = Bovespa.Corretagem.Taxa.TipoOperacao.OperacoesCobertas;
                        break;
                    case Model.Enum.TipoOperacao.Precatorios:
                        taxa.Operacao = Bovespa.Corretagem.Taxa.TipoOperacao.Precatorios;
                        break;
                    default:
                        break;
                }


                //taxa.Papel = (Bovespa.Corretagem.Taxa.TipoPapel)from.Papel;

                switch (from.Papel.Value)
                {
                    case Model.Enum.TipoPapel.Debentures:
                        taxa.Papel = Bovespa.Corretagem.Taxa.TipoPapel.Debentures;
                        break;
                    case Model.Enum.TipoPapel.Especialista:
                        taxa.Papel = Bovespa.Corretagem.Taxa.TipoPapel.Especialista;
                        break;
                    case Model.Enum.TipoPapel.Indice:
                        taxa.Papel = Bovespa.Corretagem.Taxa.TipoPapel.Indice;
                        break;
                    case Model.Enum.TipoPapel.Normal:
                        taxa.Papel = Bovespa.Corretagem.Taxa.TipoPapel.Normal;
                        break;
                    case Model.Enum.TipoPapel.Recibos:
                        taxa.Papel = Bovespa.Corretagem.Taxa.TipoPapel.Recibos;
                        break;
                    case Model.Enum.TipoPapel.POP:
                        taxa.Papel = Bovespa.Corretagem.Taxa.TipoPapel.POP;
                        break;
                    case Model.Enum.TipoPapel.CRI:
                        taxa.Papel = Bovespa.Corretagem.Taxa.TipoPapel.CRI;
                        break;
                    default:
                        break;
                }


                taxa.PercEmoluentoBovespa = from.PercEmoluentoBovespa;
                taxa.PercEmoluentoCBLC = from.PercEmoluentoCBLC;
                taxa.PercRegistroBovespa = from.PercRegistroBovespa;

                taxa.PercRegistroCBLC = from.PercRegistroCBLC;

                if (from.Periodo != null)
                {
                    taxa.Periodo = new Bovespa.Corretagem.Taxa.PeriodoRequest {
                                                    DataInicial = from.Periodo.DataInicial,
                                                    DataFinal = from.Periodo.DataFinal
                                                };
                }

            return taxa;
        }

        public List<Bovespa.Corretagem.Taxa.TaxaRequest> ToTaxaRequest(ModelCollection<Model.Taxa> from)
        {           
            if (from == null)  return null;

            List<Bovespa.Corretagem.Taxa.TaxaRequest> retorno = new List<Bovespa.Corretagem.Taxa.TaxaRequest>();

            Bovespa.Corretagem.Taxa.TaxaRequest taxa;
            foreach (Model.Taxa item in from)
            {
                taxa = new Bovespa.Corretagem.Taxa.TaxaRequest();
                
                //taxa.Cliente = (Bovespa.Corretagem.Taxa.TipoCliente)item.Cliente;
                switch (item.Cliente.Value )
                {
                    case Model.Enum.TipoCliente.CarteiraPropria:
                        taxa.Cliente = Bovespa.Corretagem.Taxa.TipoCliente.CarteiraPropria;
                        break;
                    case Model.Enum.TipoCliente.FundosClubeInvestimento:
                        taxa.Cliente = Bovespa.Corretagem.Taxa.TipoCliente.FundosClubeInvestimento;
                        break;
                    case Model.Enum.TipoCliente.Normal:
                        taxa.Cliente = Bovespa.Corretagem.Taxa.TipoCliente.Normal;
                        break;                    
                    default:
                        break;
                }

                taxa.CodigoBolsa = item.CodigoBolsa;
                //taxa.Liquidacao = (Bovespa.Corretagem.Taxa.TipoLiquidacao)item.Liquidacao;
                switch (item.Liquidacao.Value)
                {
                    case Model.Enum.TipoLiquidacao.Balcao:
                        taxa.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.Balcao;          
                        break;
                    case Model.Enum.TipoLiquidacao.OperacaoBox:
                        taxa.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.OperacaoBox;
                        break;
                    case Model.Enum.TipoLiquidacao.LiquidacaoBruta:
                        taxa.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.LiquidacaoBruta;
                        break;
                    case Model.Enum.TipoLiquidacao.Lancador:
                        taxa.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.Lancador;
                        break;
                    case Model.Enum.TipoLiquidacao.DesmancheBox:
                        taxa.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.DesmancheBox;
                        break;
                    case Model.Enum.TipoLiquidacao.Direto:
                        taxa.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.Direto;
                        break;
                    case Model.Enum.TipoLiquidacao.Normal:
                        taxa.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.Normal;
                        break;
                    case Model.Enum.TipoLiquidacao.Tomador:
                        taxa.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.Tomador;
                        break;
                    case Model.Enum.TipoLiquidacao.POP:
                        taxa.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.POP;
                        break;
                    case Model.Enum.TipoLiquidacao.TVR:
                        taxa.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.TVR;
                        break;

                    case Model.Enum.TipoLiquidacao.BTF:
                        taxa.Liquidacao = Bovespa.Corretagem.Taxa.TipoLiquidacao.BTF;
                        break;

                    default:
                        break;
                }


                taxa.Mercado = item.Mercado;
                taxa.MercadoOrigem = item.MercadoOrigem;
                taxa.NaturezaOperacao = (Bovespa.Corretagem.Taxa.TipoNaturezaOperacao)item.NaturezaOperacao;

                taxa.NomeBolsa = item.NomeBolsa;
                taxa.NomeMercado = item.NomeMercado;
                taxa.NomeMercadoOrigem = item.NomeMercadoOrigem;

                //taxa.Operacao = (Bovespa.Corretagem.Taxa.TipoOperacao)item.Operacao;

                switch (item.Operacao.Value)
                {
                    case Model.Enum.TipoOperacao.OperacoesFinais:
                        taxa.Operacao = Bovespa.Corretagem.Taxa.TipoOperacao.OperacoesFinais;
                        break;
                    case Model.Enum.TipoOperacao.DayTrade:
                        taxa.Operacao = Bovespa.Corretagem.Taxa.TipoOperacao.DayTrade;
                        break;
                    case Model.Enum.TipoOperacao.OperacoesCobertas:
                        taxa.Operacao = Bovespa.Corretagem.Taxa.TipoOperacao.OperacoesCobertas;
                        break;
                    case Model.Enum.TipoOperacao.Precatorios:
                        taxa.Operacao = Bovespa.Corretagem.Taxa.TipoOperacao.Precatorios;
                        break;
                    default:
                        break;
                }



                //taxa.Papel = (Bovespa.Corretagem.Taxa.TipoPapel)item.Papel;

                switch (item.Papel.Value)
                {
                    case Model.Enum.TipoPapel.Debentures:
                        taxa.Papel = Bovespa.Corretagem.Taxa.TipoPapel.Debentures;
                        break;
                    case Model.Enum.TipoPapel.Especialista:
                        taxa.Papel = Bovespa.Corretagem.Taxa.TipoPapel.Especialista;
                        break;
                    case Model.Enum.TipoPapel.Indice:
                        taxa.Papel = Bovespa.Corretagem.Taxa.TipoPapel.Indice;
                        break;
                    case Model.Enum.TipoPapel.Normal:
                        taxa.Papel = Bovespa.Corretagem.Taxa.TipoPapel.Normal;
                        break;
                    case Model.Enum.TipoPapel.Recibos:
                        taxa.Papel = Bovespa.Corretagem.Taxa.TipoPapel.Recibos;
                        break;
                    case Model.Enum.TipoPapel.POP:
                        taxa.Papel = Bovespa.Corretagem.Taxa.TipoPapel.POP;
                        break;
                    case Model.Enum.TipoPapel.CRI:
                        taxa.Papel = Bovespa.Corretagem.Taxa.TipoPapel.CRI;
                        break;
                    default:
                        break;
                }


                taxa.PercEmoluentoBovespa = item.PercEmoluentoBovespa;
                taxa.PercEmoluentoCBLC = item.PercEmoluentoCBLC;
                taxa.PercRegistroBovespa = item.PercRegistroBovespa;

                taxa.PercRegistroCBLC = item.PercRegistroCBLC;

                if (item.Periodo != null)
                {
                    taxa.Periodo.DataInicial = item.Periodo.DataInicial;
                    taxa.Periodo.DataFinal = item.Periodo.DataFinal;
                }
                retorno.Add(taxa);
            }
            
            return retorno;
        }

        #endregion

    }
}
